import axios from 'axios'
import { ElMessage, ElMessageBox } from 'element-plus'
import { getToken } from '@/utils/auth'
import { useUserStore } from '@/store/user'
import router from '@/router'

import { BASE_URL } from '@/config'

// 创建axios实例
const service = axios.create({
  baseURL: BASE_URL,
  timeout: 50000
})

// 添加调试日志
const logRequest = (config) => {
  console.log(`[API请求] ${config.method.toUpperCase()} ${config.url}`, config.params || config.data || {})
  return config
}

const logResponse = (response) => {
  console.log(`[API响应] ${response.config.method.toUpperCase()} ${response.config.url}`, response.data)
  return response
}

const logError = (error) => {
  console.error(`[API错误] ${error.config?.method?.toUpperCase() || 'UNKNOWN'} ${error.config?.url || 'UNKNOWN'}`, error.response?.data || error)
  return Promise.reject(error)
}

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 在发送请求之前做些什么
    // 添加必要的请求头
    if (!config.headers) {
      config.headers = {}
    }

    // 确保跨域请求正确处理
    config.headers['Content-Type'] = 'application/json'
    config.headers['X-Requested-With'] = 'XMLHttpRequest'

    // 如果有Token，添加到请求头
    const token = getToken()
    if (token) {
      config.headers['Authorization'] = `Bearer ${token}`
    }

    // 加入租户ID
    const tenantId = localStorage.getItem('tenant_id') || '1'
    config.headers['X-Tenant-ID'] = tenantId


    // 特殊处理API请求
    if (config.url.includes('/agents')) {
      console.log('检测到代理管理API请求:', config.url)
    }

    if (config.url.includes('/articles')) {
      console.log('检测到文章管理API请求:', config.url)
    }

    if (config.url.includes('/notices')) {
      console.log('检测到公告管理API请求:', config.url)
    }

    // 某些接口需要admin前缀，有些不需要
    // 让后端的路由处理URL前缀

    return logRequest(config)
  },
  error => {
    return logError(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    logResponse(response)

    // 如果响应的状态码为非2xx，则抛出错误
    if (response.status < 200 || response.status >= 300) {
      return Promise.reject(new Error(response.statusText || '请求失败'))
    }

    const res = response.data

    // 检查响应中是否包含code字段
    if (res.code !== undefined) {
      // 0表示成功，其他表示失败
      if (res.code !== 0) {
        // 处理业务错误
        ElMessage({
          message: res.message || '请求失败',
          type: 'error',
          duration: 5 * 1000
        })

        // 50008: 非法的token; 50009: 其他客户端登录; 50010: Token过期;
        if (res.code === 50008 || res.code === 50009 || res.code === 50010 || res.code === 401) {
          // 重新登录
          ElMessageBox.confirm(
            '您已经登出，请重新登录',
            '确认登出', {
            confirmButtonText: '重新登录',
            cancelButtonText: '取消',
            type: 'warning'
          }
          ).then(() => {
            const userStore = useUserStore()
            userStore.resetState()
            location.reload()
          })
        }

        return Promise.reject(new Error(res.message || '请求失败'))
      }
    }

    // 返回数据
    return res
  },
  error => {
    logError(error)

    // 显示错误消息
    const status = error.response?.status || 0
    let errorMessage = '请求失败'

    // 获取错误详情
    if (error.response && error.response.data) {
      if (error.response.data.message) {
        errorMessage = error.response.data.message
      } else if (error.response.data.error) {
        errorMessage = error.response.data.error
      } else if (typeof error.response.data === 'string') {
        errorMessage = error.response.data
      }
    } else {
      // 针对特定错误码提供更有意义的错误信息
      if (status === 401) {
        errorMessage = '未授权，请重新登录'

        // 获取用户Store
        const userStore = useUserStore()
        userStore.resetState()
        router.push('/login')
      } else if (status === 403) {
        errorMessage = '权限不足，无法访问'
      } else if (status === 404) {
        errorMessage = '请求的资源不存在'
      } else if (status === 500) {
        errorMessage = '服务器内部错误'
      } else if (error.message.includes('Network Error')) {
        errorMessage = '网络错误，请检查您的网络连接'
      }
    }
    //  else if (error.message.includes('timeout')) {
    //       errorMessage = '请求超时，请稍后再试'
    //     } 
    // 测试账号操作限制提示
    if (error.response?.data?.error === 'test_account_restricted') {
      errorMessage = '测试账号无权限执行此操作'
    }

    ElMessage({
      message: errorMessage,
      type: 'error',
      duration: 5 * 1000
    })

    return Promise.reject(error)
  }
)

export default service